package com.input4hua.expr.time;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 日期表达式 抽象处理类
 *
 * @author Jiahua.hu
 * @since 13 May 2019
 */
public abstract class AbstractDateHandler implements DateHandler {

	private AbstractDateHandler nextHandler;

	@Override
	public String process(String req) {
		if (canProcess(req)) {
			//自身能处理，那就处理一下，在所不辞
			req = response(req);
		}
		if (this.nextHandler != null) {
			//自己处理完了，交给下一环节再接着处理
			req = this.nextHandler.process(req);
		}
		return req;
	}

	public void setNextHandler(AbstractDateHandler nextHandler) {
		this.nextHandler = nextHandler;
	}

	/**
	 * 模板方法 匹配表达式并替换
	 * @param req
	 * @return
	 */
	protected String response(String req) {
		StringBuffer sb = new StringBuffer();
		Matcher m = getPattern().matcher(req);
		while (m.find()) {
			String expr = m.group(0);
			m.appendReplacement(sb, exprParse(expr));
		}
		m.appendTail(sb);
		return sb.toString();
	}

	/**
	 * 模板方法 判断是否当前节点能处理
	 * @param req
	 * @return
	 */
	protected boolean canProcess(String req) {
		return getPattern().matcher(req).find();
	}

	/**
	 * 子类需自己判断并解析表达式
	 * @param expr String
	 * @return String
	 */
	protected abstract String exprParse(String expr);

	/**
	 * 子类需提供正则模板
	 * @return Pattern
	 */
	protected abstract Pattern getPattern();

}
